#pragma once
#include <string>
#include <map>

using namespace std;

struct FunctionInterface
{
    void (*info)(const string &str) = nullptr;
};

namespace SUI
{
class Tragers
{
public:
    // const string command;
    // void (*func)(const string &str);
    map<string, void (*)(const string &str)> tragerMp;


    Tragers(std::initializer_list<pair<string,void (*)(const string &str)>> initList)
    {
        for(auto item : initList)
        {
            tragerMp.insert(make_pair(item.first, item.second));
        }
    }

    int Match(const string &str)
    {
        
        std::size_t idx = str.find_first_of(' ');
        if(idx == string::npos)
            idx = str.length();
        string cmd = str.substr(0,idx);
        if(tragerMp.find(cmd) != tragerMp.end())
        {
            string args = str.substr(idx+1, str.length());
            tragerMp[cmd](args);
            return 1;
        }
        return 0;
    }
};
};
int recognizeFromStr(std::string str);
int recognizeLoop();